{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "kMccmZPoWd_h"
   },
   "source": [
    "# Mixup augmentation for NLP\n",
    "\n",
    "Using IMDB sentiment classification dataset"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 527
    },
    "colab_type": "code",
    "id": "YhKEHbrxWd_n",
    "outputId": "368747f0-47d5-439f-f4b3-d4db6d6a2d18"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Collecting textaugment\n",
      "  Downloading https://files.pythonhosted.org/packages/d5/87/906c855827f99a65ab91b22afbfa91731bd4397b5e3ca344de571e5c7651/textaugment-1.3-py3-none-any.whl\n",
      "Requirement already satisfied: nltk in /usr/local/lib/python3.6/dist-packages (from textaugment) (3.2.5)\n",
      "Requirement already satisfied: numpy in /usr/local/lib/python3.6/dist-packages (from textaugment) (1.18.4)\n",
      "Requirement already satisfied: textblob in /usr/local/lib/python3.6/dist-packages (from textaugment) (0.15.3)\n",
      "Requirement already satisfied: gensim in /usr/local/lib/python3.6/dist-packages (from textaugment) (3.6.0)\n",
      "Collecting googletrans\n",
      "  Downloading https://files.pythonhosted.org/packages/fd/f0/a22d41d3846d1f46a4f20086141e0428ccc9c6d644aacbfd30990cf46886/googletrans-2.4.0.tar.gz\n",
      "Requirement already satisfied: six in /usr/local/lib/python3.6/dist-packages (from nltk->textaugment) (1.12.0)\n",
      "Requirement already satisfied: scipy>=0.18.1 in /usr/local/lib/python3.6/dist-packages (from gensim->textaugment) (1.4.1)\n",
      "Requirement already satisfied: smart-open>=1.2.1 in /usr/local/lib/python3.6/dist-packages (from gensim->textaugment) (2.0.0)\n",
      "Requirement already satisfied: requests in /usr/local/lib/python3.6/dist-packages (from googletrans->textaugment) (2.23.0)\n",
      "Requirement already satisfied: boto3 in /usr/local/lib/python3.6/dist-packages (from smart-open>=1.2.1->gensim->textaugment) (1.13.13)\n",
      "Requirement already satisfied: boto in /usr/local/lib/python3.6/dist-packages (from smart-open>=1.2.1->gensim->textaugment) (2.49.0)\n",
      "Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.6/dist-packages (from requests->googletrans->textaugment) (2.9)\n",
      "Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.6/dist-packages (from requests->googletrans->textaugment) (1.24.3)\n",
      "Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.6/dist-packages (from requests->googletrans->textaugment) (3.0.4)\n",
      "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.6/dist-packages (from requests->googletrans->textaugment) (2020.4.5.1)\n",
      "Requirement already satisfied: botocore<1.17.0,>=1.16.13 in /usr/local/lib/python3.6/dist-packages (from boto3->smart-open>=1.2.1->gensim->textaugment) (1.16.13)\n",
      "Requirement already satisfied: jmespath<1.0.0,>=0.7.1 in /usr/local/lib/python3.6/dist-packages (from boto3->smart-open>=1.2.1->gensim->textaugment) (0.10.0)\n",
      "Requirement already satisfied: s3transfer<0.4.0,>=0.3.0 in /usr/local/lib/python3.6/dist-packages (from boto3->smart-open>=1.2.1->gensim->textaugment) (0.3.3)\n",
      "Requirement already satisfied: docutils<0.16,>=0.10 in /usr/local/lib/python3.6/dist-packages (from botocore<1.17.0,>=1.16.13->boto3->smart-open>=1.2.1->gensim->textaugment) (0.15.2)\n",
      "Requirement already satisfied: python-dateutil<3.0.0,>=2.1 in /usr/local/lib/python3.6/dist-packages (from botocore<1.17.0,>=1.16.13->boto3->smart-open>=1.2.1->gensim->textaugment) (2.8.1)\n",
      "Building wheels for collected packages: googletrans\n",
      "  Building wheel for googletrans (setup.py) ... \u001b[?25l\u001b[?25hdone\n",
      "  Created wheel for googletrans: filename=googletrans-2.4.0-cp36-none-any.whl size=15777 sha256=4de7ce4b52a5c57a680d9c96137d12291609a418bf5fdd1cf158003f747c7589\n",
      "  Stored in directory: /root/.cache/pip/wheels/50/d6/e7/a8efd5f2427d5eb258070048718fa56ee5ac57fd6f53505f95\n",
      "Successfully built googletrans\n",
      "Installing collected packages: googletrans, textaugment\n",
      "Successfully installed googletrans-2.4.0 textaugment-1.3\n"
     ]
    }
   ],
   "source": [
    "# Import libraries\n",
    "try:\n",
    "  import textaugment\n",
    "except ModuleNotFoundError:\n",
    "  !pip install textaugment\n",
    "  import textaugment\n",
    "\n",
    "import pandas as pd\n",
    "\n",
    "import tensorflow as tf\n",
    "from tensorflow.keras.preprocessing import sequence\n",
    "from tensorflow.keras.models import Sequential\n",
    "from tensorflow.keras.layers import Dense, Dropout, Activation\n",
    "from tensorflow.keras.layers import Embedding\n",
    "from tensorflow.keras.layers import Conv1D, GlobalMaxPooling1D\n",
    "from tensorflow.keras.datasets import imdb\n",
    "\n",
    "from textaugment import MIXUP\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 34
    },
    "colab_type": "code",
    "id": "JeMsxayIWd_r",
    "outputId": "814596bf-e5ca-47f1-c2ce-257e761e96c4"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'2.2.0'"
      ]
     },
     "execution_count": 2,
     "metadata": {
      "tags": []
     },
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tf.__version__"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 34
    },
    "colab_type": "code",
    "id": "_FbvA0uwRdEZ",
    "outputId": "8e912f45-8b7e-4ee7-a3ad-f342c3f090c7"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'1.3'"
      ]
     },
     "execution_count": 3,
     "metadata": {
      "tags": []
     },
     "output_type": "execute_result"
    }
   ],
   "source": [
    "textaugment.__version__"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "Oz8O8tISRdEg"
   },
   "source": [
    "## Initialize constant variables"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "mg1AcYIWWd_w"
   },
   "outputs": [],
   "source": [
    "# set parameters:\n",
    "max_features = 5000\n",
    "maxlen = 400\n",
    "batch_size = 32\n",
    "embedding_dims = 50\n",
    "filters = 250\n",
    "kernel_size = 3\n",
    "hidden_dims = 250\n",
    "epochs = 10\n",
    "runs = 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 153
    },
    "colab_type": "code",
    "id": "ZRuNNVstWd_0",
    "outputId": "bc4ce3b2-5a12-4600-d1a8-b466615018df"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Loading data...\n",
      "Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/imdb.npz\n",
      "17465344/17464789 [==============================] - 0s 0us/step\n",
      "25000 train sequences\n",
      "25000 test sequences\n",
      "Pad sequences (samples x time)\n",
      "x_train shape: (25000, 400)\n",
      "x_test shape: (25000, 400)\n"
     ]
    }
   ],
   "source": [
    "print('Loading data...')\n",
    "(x_train, y_train), (x_test, y_test) = imdb.load_data(num_words=max_features)\n",
    "print(len(x_train), 'train sequences')\n",
    "print(len(x_test), 'test sequences')\n",
    "\n",
    "print('Pad sequences (samples x time)')\n",
    "x_train = sequence.pad_sequences(x_train, maxlen=maxlen)\n",
    "x_test = sequence.pad_sequences(x_test, maxlen=maxlen)\n",
    "print('x_train shape:', x_train.shape)\n",
    "print('x_test shape:', x_test.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "Tx73Y-asRdEz"
   },
   "source": [
    "## Initialize mixup"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "xvuxODUxRdE1"
   },
   "outputs": [],
   "source": [
    "mixup = MIXUP()\n",
    "generator, step = mixup.flow(x_train, y_train, batch_size=batch_size, runs=runs)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 476
    },
    "colab_type": "code",
    "id": "6cm1o_fAWd_4",
    "outputId": "ea793754-100c-4c12-8acf-7798c096c399"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Build model...\n",
      "Model: \"sequential\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "embedding (Embedding)        (None, 400, 50)           250000    \n",
      "_________________________________________________________________\n",
      "dropout (Dropout)            (None, 400, 50)           0         \n",
      "_________________________________________________________________\n",
      "conv1d (Conv1D)              (None, 398, 250)          37750     \n",
      "_________________________________________________________________\n",
      "global_max_pooling1d (Global (None, 250)               0         \n",
      "_________________________________________________________________\n",
      "dense (Dense)                (None, 250)               62750     \n",
      "_________________________________________________________________\n",
      "dropout_1 (Dropout)          (None, 250)               0         \n",
      "_________________________________________________________________\n",
      "activation (Activation)      (None, 250)               0         \n",
      "_________________________________________________________________\n",
      "dense_1 (Dense)              (None, 1)                 251       \n",
      "_________________________________________________________________\n",
      "activation_1 (Activation)    (None, 1)                 0         \n",
      "=================================================================\n",
      "Total params: 350,751\n",
      "Trainable params: 350,751\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "print('Build model...')\n",
    "model = Sequential()\n",
    "\n",
    "# we start off with an efficient embedding layer which maps\n",
    "# our vocab indices into embedding_dims dimensions\n",
    "model.add(Embedding(max_features,\n",
    "                    embedding_dims,\n",
    "                    input_length=maxlen))\n",
    "model.add(Dropout(0.2))\n",
    "\n",
    "# we add a Convolution1D, which will learn filters\n",
    "# word group filters of size filter_length:\n",
    "model.add(Conv1D(filters,\n",
    "                 kernel_size,\n",
    "                 padding='valid',\n",
    "                 activation='relu',\n",
    "                 strides=1))\n",
    "# we use max pooling:\n",
    "model.add(GlobalMaxPooling1D())\n",
    "\n",
    "# We add a vanilla hidden layer:\n",
    "model.add(Dense(hidden_dims))\n",
    "model.add(Dropout(0.2))\n",
    "model.add(Activation('relu'))\n",
    "\n",
    "# We project onto a single unit output layer, and squash it with a sigmoid:\n",
    "model.add(Dense(1))\n",
    "model.add(Activation('sigmoid'))\n",
    "\n",
    "model.compile(loss='binary_crossentropy',\n",
    "              optimizer='adam',\n",
    "              metrics=['accuracy'])\n",
    "model.summary()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "b5zRyuq8UKmR"
   },
   "source": [
    "## Train model using mixup augmentation"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 357
    },
    "colab_type": "code",
    "id": "oGLSfzcUWeAB",
    "outputId": "81464964-8fd3-4249-b901-0e05cb664436"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/10\n",
      "782/782 [==============================] - 8s 10ms/step - loss: 0.6867 - accuracy: 0.2859 - val_loss: 0.6408 - val_accuracy: 0.6537\n",
      "Epoch 2/10\n",
      "782/782 [==============================] - 8s 10ms/step - loss: 0.6655 - accuracy: 0.3081 - val_loss: 0.6140 - val_accuracy: 0.6620\n",
      "Epoch 3/10\n",
      "782/782 [==============================] - 8s 10ms/step - loss: 0.6443 - accuracy: 0.3267 - val_loss: 0.5688 - val_accuracy: 0.7233\n",
      "Epoch 4/10\n",
      "782/782 [==============================] - 8s 10ms/step - loss: 0.6250 - accuracy: 0.3287 - val_loss: 0.5167 - val_accuracy: 0.7434\n",
      "Epoch 5/10\n",
      "782/782 [==============================] - 8s 10ms/step - loss: 0.6140 - accuracy: 0.3337 - val_loss: 0.5154 - val_accuracy: 0.7534\n",
      "Epoch 6/10\n",
      "782/782 [==============================] - 8s 10ms/step - loss: 0.6029 - accuracy: 0.3338 - val_loss: 0.4763 - val_accuracy: 0.7765\n",
      "Epoch 7/10\n",
      "782/782 [==============================] - 8s 10ms/step - loss: 0.5976 - accuracy: 0.3314 - val_loss: 0.4659 - val_accuracy: 0.7810\n",
      "Epoch 8/10\n",
      "782/782 [==============================] - 8s 10ms/step - loss: 0.5857 - accuracy: 0.3423 - val_loss: 0.4551 - val_accuracy: 0.7873\n",
      "Epoch 9/10\n",
      "782/782 [==============================] - 8s 10ms/step - loss: 0.5800 - accuracy: 0.3488 - val_loss: 0.4502 - val_accuracy: 0.7927\n",
      "Epoch 10/10\n",
      "782/782 [==============================] - 8s 10ms/step - loss: 0.5793 - accuracy: 0.3402 - val_loss: 0.4653 - val_accuracy: 0.7927\n"
     ]
    }
   ],
   "source": [
    "h1 = model.fit(generator, steps_per_epoch=step,\n",
    "          epochs=epochs,\n",
    "          validation_data=(x_test, y_test))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 298
    },
    "colab_type": "code",
    "id": "XKrXdkt8XeYo",
    "outputId": "0d463439-1718-4f90-bc24-b32f6dae7eda"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x7f13e7945550>"
      ]
     },
     "execution_count": 9,
     "metadata": {
      "tags": []
     },
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light",
      "tags": []
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "pd.DataFrame(h1.history)[['loss','val_loss']].plot(title=\"With mixup\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 476
    },
    "colab_type": "code",
    "id": "Iiv7ahP8WeAF",
    "outputId": "0ad04311-b497-4830-dd50-a832daf583ac"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Build model...\n",
      "Model: \"sequential_1\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "embedding_1 (Embedding)      (None, 400, 50)           250000    \n",
      "_________________________________________________________________\n",
      "dropout_2 (Dropout)          (None, 400, 50)           0         \n",
      "_________________________________________________________________\n",
      "conv1d_1 (Conv1D)            (None, 398, 250)          37750     \n",
      "_________________________________________________________________\n",
      "global_max_pooling1d_1 (Glob (None, 250)               0         \n",
      "_________________________________________________________________\n",
      "dense_2 (Dense)              (None, 250)               62750     \n",
      "_________________________________________________________________\n",
      "dropout_3 (Dropout)          (None, 250)               0         \n",
      "_________________________________________________________________\n",
      "activation_2 (Activation)    (None, 250)               0         \n",
      "_________________________________________________________________\n",
      "dense_3 (Dense)              (None, 1)                 251       \n",
      "_________________________________________________________________\n",
      "activation_3 (Activation)    (None, 1)                 0         \n",
      "=================================================================\n",
      "Total params: 350,751\n",
      "Trainable params: 350,751\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "print('Build model...')\n",
    "model2 = Sequential()\n",
    "\n",
    "# we start off with an efficient embedding layer which maps\n",
    "# our vocab indices into embedding_dims dimensions\n",
    "model2.add(Embedding(max_features,\n",
    "                    embedding_dims,\n",
    "                    input_length=maxlen))\n",
    "model2.add(Dropout(0.2))\n",
    "\n",
    "# we add a Convolution1D, which will learn filters\n",
    "# word group filters of size filter_length:\n",
    "model2.add(Conv1D(filters,\n",
    "                 kernel_size,\n",
    "                 padding='valid',\n",
    "                 activation='relu',\n",
    "                 strides=1))\n",
    "# we use max pooling:\n",
    "model2.add(GlobalMaxPooling1D())\n",
    "\n",
    "# We add a vanilla hidden layer:\n",
    "model2.add(Dense(hidden_dims))\n",
    "model2.add(Dropout(0.2))\n",
    "model2.add(Activation('relu'))\n",
    "\n",
    "# We project onto a single unit output layer, and squash it with a sigmoid:\n",
    "model2.add(Dense(1))\n",
    "model2.add(Activation('sigmoid'))\n",
    "\n",
    "model2.compile(loss='binary_crossentropy',\n",
    "              optimizer='adam',\n",
    "              metrics=['accuracy'])\n",
    "model2.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 357
    },
    "colab_type": "code",
    "id": "ygNHmhGMWeAI",
    "outputId": "1592613d-52d2-409b-e210-cceddb7f5bbd"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/10\n",
      "782/782 [==============================] - 8s 10ms/step - loss: 0.4057 - accuracy: 0.7964 - val_loss: 0.2819 - val_accuracy: 0.8825\n",
      "Epoch 2/10\n",
      "782/782 [==============================] - 8s 10ms/step - loss: 0.2260 - accuracy: 0.9100 - val_loss: 0.2540 - val_accuracy: 0.8957\n",
      "Epoch 3/10\n",
      "782/782 [==============================] - 8s 10ms/step - loss: 0.1579 - accuracy: 0.9409 - val_loss: 0.2806 - val_accuracy: 0.8874\n",
      "Epoch 4/10\n",
      "782/782 [==============================] - 8s 10ms/step - loss: 0.1056 - accuracy: 0.9625 - val_loss: 0.3103 - val_accuracy: 0.8897\n",
      "Epoch 5/10\n",
      "782/782 [==============================] - 8s 10ms/step - loss: 0.0732 - accuracy: 0.9730 - val_loss: 0.3593 - val_accuracy: 0.8838\n",
      "Epoch 6/10\n",
      "782/782 [==============================] - 8s 10ms/step - loss: 0.0539 - accuracy: 0.9808 - val_loss: 0.3938 - val_accuracy: 0.8884\n",
      "Epoch 7/10\n",
      "782/782 [==============================] - 8s 10ms/step - loss: 0.0419 - accuracy: 0.9854 - val_loss: 0.4444 - val_accuracy: 0.8817\n",
      "Epoch 8/10\n",
      "782/782 [==============================] - 8s 10ms/step - loss: 0.0340 - accuracy: 0.9876 - val_loss: 0.4842 - val_accuracy: 0.8870\n",
      "Epoch 9/10\n",
      "782/782 [==============================] - 8s 10ms/step - loss: 0.0388 - accuracy: 0.9857 - val_loss: 0.4686 - val_accuracy: 0.8863\n",
      "Epoch 10/10\n",
      "782/782 [==============================] - 8s 10ms/step - loss: 0.0314 - accuracy: 0.9887 - val_loss: 0.6685 - val_accuracy: 0.8559\n"
     ]
    }
   ],
   "source": [
    "h2 = model2.fit(x_train, y_train,\n",
    "          batch_size=batch_size,\n",
    "          epochs=epochs,\n",
    "          validation_data=(x_test, y_test))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 298
    },
    "colab_type": "code",
    "id": "DzJEhaPrWeAM",
    "outputId": "aec6c655-c5f8-434b-bb16-d1e1056adc03"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x7f13e69ad0f0>"
      ]
     },
     "execution_count": 12,
     "metadata": {
      "tags": []
     },
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light",
      "tags": []
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "pd.DataFrame(h2.history)[['loss','val_loss']].plot(title=\"Without mixup\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "M2HDERJbGr2a"
   },
   "source": [
    "# Comparison\n",
    "See the loss curve with mixup does not overfit."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "hqteWafKRdF1"
   },
   "source": [
    "## Cite the paper\n",
    "```\n",
    "@article{marivate2019improving,\n",
    "  title={Improving short text classification through global augmentation methods},\n",
    "  author={Marivate, Vukosi and Sefara, Tshephisho},\n",
    "  journal={arXiv preprint arXiv:1907.03752},\n",
    "  year={2019}\n",
    "}```\n",
    "\n",
    "https://arxiv.org/abs/1907.03752"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "accelerator": "GPU",
  "colab": {
   "collapsed_sections": [],
   "name": "mixup_example_using_IMDB_sentiment.ipynb",
   "provenance": []
  },
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
